#include "AABB.h"
#include <SEMath/Shapes/Loader/ShapeLoader.h>
#include <limits>

namespace SEngine
{
    template<>
    std::unique_ptr<AABB> ShapeLoader::CreateImpl<AABB>() {
        glm::vec3 min{std::numeric_limits<float>::max()};
        glm::vec3 max{std::numeric_limits<float>::min()};
        for (auto & vertex : m_vertices) {
            min.x = glm::min(vertex.x, min.x);
            max.x = glm::max(vertex.x, max.x);
            min.y = glm::min(vertex.y, min.y);
            max.y = glm::max(vertex.y, max.y);
            min.z = glm::min(vertex.x, min.z);
            max.z = glm::max(vertex.x, max.z);
        }
        return std::make_unique<AABB>(min, max);
    }

    void AABB::Transform(glm::mat4 matrix)
    {
        ShapeLoader loader;
        loader.AddVertex(matrix * glm::vec4{m_min.x, m_min.y, m_min.z, 1.0f});
        loader.AddVertex(matrix * glm::vec4{m_min.x, m_min.y, m_max.z, 1.0f});
        loader.AddVertex(matrix * glm::vec4{m_max.x, m_min.y, m_max.z, 1.0f});
        loader.AddVertex(matrix * glm::vec4{m_max.x, m_min.y, m_min.z, 1.0f});
        loader.AddVertex(matrix * glm::vec4{m_min.x, m_max.y, m_min.z, 1.0f});
        loader.AddVertex(matrix * glm::vec4{m_min.x, m_max.y, m_max.z, 1.0f});
        loader.AddVertex(matrix * glm::vec4{m_max.x, m_max.y, m_max.z, 1.0f});
        loader.AddVertex(matrix * glm::vec4{m_max.x, m_max.y, m_min.z, 1.0f});
        auto newShape = loader.Create<AABB>();
        m_min = newShape->m_min;
        m_max = newShape->m_max;
    }
}
